function [lmsections, lmcurvature] = optlevmar(sections, breaks, y, step, mode)
format long;%Создание массивов
n = length(y);

sections
breaks
step
n

%Надо учесть размерность шага
borders=floor(sections/step)

%Инициализация
k = length(borders)-2; %Число точек разбиения
q = 4*(k+1); %Размерность матрицы квадратичных членов
result = zeros(k+2, 1); %Число границ участков
k

%Дополнительные условия, получение числа участков постоянной кривизны
switch mode
	case 0
		%Четные участки постоянной кривизны
		if rem(k, 2)==0 d=k/2+mode;
		else d=(k+1)/2; 
		end;
	case 1
		%Нечетные участки постоянной кривизны
		if rem(k, 2)==0 d=k/2+mode;
		else d=(k+1)/2; 
		end;
	otherwise;
        d=0;
end;
d

%Создание матрицA = zeros(3*k+d, q); %Матрица ограничений для коэффициентов сплайна
B = zeros(3*k+d, 1);

%Создание матрицы ограничений для коэффициентов сплайна
lrc=0; %Lost rows counter
for i=1:k
	j=4*i;
	lft = sections(i);
	rgt = sections(i+1);

	if (d~=0)&(rem(i, 2)==mode) 
		A(j-3-lrc, j-3:j)=[0 0 0 1]; 
		A(j-2-lrc:j-lrc, j-3:j+4)=[1, (rgt-lft), (rgt-lft)^2, 0, -1,  0,  0, 0; ...
				0,         1, 2*(rgt-lft), 0,  0, -1,  0, 0; ...
				0,         0,           1, 0,  0,  0, -1, 0];
	else	
		lrc=lrc+1;
		A(j-2-lrc:j-lrc, j-3:j+4)=[1, (rgt-lft), (rgt-lft)^2,   (rgt-lft)^3, -1,  0,  0, 0; ...
				0,         1, 2*(rgt-lft), 3*(rgt-lft)^2,  0, -1,  0, 0; ...
				0,         0,           1,   3*(rgt-lft),  0,  0, -1, 0];
	end
end

%Граничные условия
i=k+1;
j=4*i;
if (d~=0)&(rem(i, 2)==mode) A(j-3-lrc, j-3:j)=[0 0 0 1]; end;

% Initial condition
if (length(breaks)==0)|(floor(sections(k+2)/step)+1!=n)
	p0=[];
else
	p0=zeros(1, q)
	for i=1:k+1		
		j=4*i;
		lft = sections(i);
		rgt = sections(i+1);
		dst=rgt-lft;
		
		p0(1, j-1)=breaks(i)/2;				p0(1, j)=(breaks(i+1)-breaks(i))/dst/6;
	
		p0(1, j-3)=y(floor(lft/step)+1);
		p0(1, j-2)=((y(floor(rgt/step)+1)-y(floor(lft/step)+1))- ...
						dst^2*(p0(1, j-1)+dst*p0(1, j)))/dst;	end
end
p0
%Ограничения на коэффициенты
lb=zeros(1, q)-realmax;
ub=zeros(1, q)+realmax;
n
size(lb)
size(ub)

itmax=200;
opts=[1e-03, 1e-15, 1e-15, 1e-20, 1e-06];
%[ret, popt, info, covar]=levmar('opt', p0, y, itmax, opts, 'unc');
%[ret, popt, info, covar]=levmar('opt', p0, y, itmax, opts, 'blec', lb, ub, A, B);
[ret, popt, info, covar]=levmar('opt', 'optjac', p0, y, itmax, opts, 'lec', A, B);
ret
popt
info
covar
lmsections=sections;
lmcurvature=breaks;
